/**
* @author Eugenia Jose
* @author Fernando Turon
* @version 1.0 15-04-12
*
* La clase Servidor proporciona la ventana mediante la cual
*   se iniciar� el servidor RMI. Es necesario para ejecutar las otros subsistemas de la aplicaci�n
*
* @see RemotoInterface, RemotoImplementacion, GestorIdiomas
*/
package edu.uoc.tds.pec4.server;

import java.awt.Color;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import javax.swing.JOptionPane;
import javax.swing.UIManager;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.server.impl.RemotoImplementacion;

public class Servidor extends javax.swing.JFrame {
    /** Interface para implementar el servidor remoto */
    private RemotoInterface remotoInterface;
    /** Atributo referido al la URL del servidor remoto. */
    private final String url = new String("rmi://localhost/eOlympics");

    /**
     * Constructor sin parámetros de la clase Servidor.
     * Crea una instancia de Servidor.
     * {pre: no hay parámetros}
     * {post: devuelve una instancia de la clase Servidor}
     */
    public Servidor() {
        try {
            myInitComponents();
             //Se inicializa el control de mensajes
            if (!GestorIdiomas.setDefaultLanguage("i18n/messages")){
                JOptionPane.showMessageDialog(null, "No se ha encontrado el fichero de mensajes", "error", JOptionPane.ERROR_MESSAGE);
            }

            else{
                initComponents();
                remotoInterface = new RemotoImplementacion();
            }
        }
        
        /** Capturamos excepción de carácter general*/        
        catch (Exception exc) {
            //Error inesperado
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.servidor.registrando.rmi"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jbtnIniciarServidor = new javax.swing.JButton();
        jbtnDetenerServidor = new javax.swing.JButton();
        jlblInformacion = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("i18n/messages"); // NOI18N
        setTitle(bundle.getString("Servidor.title")); // NOI18N

        jbtnIniciarServidor.setFont(new java.awt.Font("Tahoma", 1, 12));
        jbtnIniciarServidor.setText(bundle.getString("jbtnIniciarServidor.text")); // NOI18N
        jbtnIniciarServidor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnIniciarServidorActionPerformed(evt);
            }
        });

        jbtnDetenerServidor.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jbtnDetenerServidor.setText(bundle.getString("jbtnDetenerServidor")); // NOI18N
        jbtnDetenerServidor.setEnabled(false);
        jbtnDetenerServidor.setPreferredSize(new java.awt.Dimension(125, 23));
        jbtnDetenerServidor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnDetenerServidorActionPerformed(evt);
            }
        });

        jlblInformacion.setFont(new java.awt.Font("Tahoma", 1, 12));
        jlblInformacion.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jlblInformacion.setText(bundle.getString("jlblInformacion")); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jlblInformacion, javax.swing.GroupLayout.DEFAULT_SIZE, 473, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jbtnIniciarServidor, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 116, Short.MAX_VALUE)
                        .addComponent(jbtnDetenerServidor, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(44, 44, 44)
                .addComponent(jlblInformacion)
                .addGap(36, 36, 36)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jbtnIniciarServidor)
                    .addComponent(jbtnDetenerServidor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(29, Short.MAX_VALUE))
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-501)/2, (screenSize.height-181)/2, 501, 181);
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Método para iniciar los componentes que forman parte de la clase. Se asignan valores a sus atributos
     * {pre: la clase ha de estar instanciada previamente}
     * {post: permite que el atributo setVIsible se pueda establecer a TRUE}
     */
    private void myInitComponents(){
        setLookAndFeelWIndows();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                DetenerServidor();
            }
        });
    }

    /**
     * Método para establecer la apariencia de la venta en función del sistema operativo, utilizando la apariencia predetermianda del sistema operativo
     * {pre: se ejecuta en el momento en que se instancia la clase}
     * {post: no devuelve ningún tipo de valor aunque se controla la posible presencia de excepciones}
     */
    private void setLookAndFeelWIndows(){
	try{
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
	}

        /** Capturamos excepción de carácter general*/
        catch(Exception exc){
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.lookAndFeel"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
	}
    }

    /**
     * Método que controla la acción sobre el componente jbtnIniciar
     * {pre: la clase ha de estar instanciada previamente}
     * {post: redirige al método que inicia el servicio RMI}
     * @param evt hace referencia a la instancia de ActionEvent que origina la ejecución del método
     */
    private void jbtnIniciarServidorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnIniciarServidorActionPerformed
        IniciarServidor();
    }//GEN-LAST:event_jbtnIniciarServidorActionPerformed

    /**
     * Método que controla la acción sobre el componente jbtnDetenerServicio
     * {pre: la clase ha de estar instanciada previamente}
     * {post: redirige al método que detiene el servicio RMI}
     * @param evt hace referencia a la instancia de ActionEvent que origina la ejecución del método
     */
    private void jbtnDetenerServidorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnDetenerServidorActionPerformed
        DetenerServidor();
    }//GEN-LAST:event_jbtnDetenerServidorActionPerformed

    /**
     * Método que inicia el Servicio RMI de acceso remoto
     * {pre: la clase ha de estar instanciada previamente}
     * {post: inicia el servicio RMI}
     */
    private void IniciarServidor(){
        try {
            Naming.rebind(url, remotoInterface);
            jlblInformacion.setForeground(Color.blue);
            jlblInformacion.setText(GestorIdiomas.getMessage("info.servidor.iniciado"));

            this.jbtnIniciarServidor.setEnabled(false);
            this.jbtnDetenerServidor.setEnabled(true);
        }

        catch (RemoteException exc) {
            try {
                jlblInformacion.setText(GestorIdiomas.getMessage("info.servidor.iniciado"));
            }

            /** Capturamos excepción de carácter general*/
            catch (Exception ex) {
                //Error inesperado
                jlblInformacion.setText(GestorIdiomas.getMessage("error.servidor.iniciado"));
            }
        }

        /** Capturamos excepción asociada a la creación de la URL del servidor RMI*/
        catch (MalformedURLException exc) {
            //La URL es incorrecta
            jlblInformacion.setText(GestorIdiomas.getMessage("error.servidor.iniciado"));
        }

        /** Capturamos excepción de carácter general*/
        catch (Exception exc) {
            jlblInformacion.setText(GestorIdiomas.getMessage("error.general"));
        }
    }

    /**
     * Método que detiene el Servicio RMI de acceso remoto
     * {pre: la clase ha de estar instanciada previamente}
     * {post: deteniene el servicio RMI}
     */
    private void DetenerServidor(){
        try {
            //Recorremos el array de objetos rmi que hayan podido quedar abiertos y los cerramos
            String rmiObject[] = {};
            rmiObject = Naming.list("rmi://localhost");

            if (rmiObject.length > 0) {
                for (int i = 0; i < rmiObject.length; i++) {
                    Naming.unbind(rmiObject[i]);
                    break;
                }
                jlblInformacion.setText(GestorIdiomas.getMessage("info.servidor.detenido"));
            }

            else {
                jlblInformacion.setText(GestorIdiomas.getMessage("info.servidor.no.iniciado"));
            }

            //Rehabilitamos y o deshabilitamos los botones correspondientes
            this.jbtnIniciarServidor.setEnabled(true);
            this.jbtnDetenerServidor.setEnabled(false);
        }

        /** Capturamos excepción asociada a errores en el la asociaciÓn de un serviCio RMI*/
        catch (NotBoundException exc) {
            jlblInformacion.setText(GestorIdiomas.getMessage("error.servidor.detenido"));
        }

        /** Capturamos excepción asociada al servidor RMI*/
        catch (RemoteException exc) {
            jlblInformacion.setText(GestorIdiomas.getMessage("error.servidor.detenido"));
        }

        /** Capturamos excepción asociada a la creación de la URL del servidor RMI*/
        catch (MalformedURLException exc) {
            jlblInformacion.setText(GestorIdiomas.getMessage("error.servidor.detenido"));
        }

        /** Capturamos excepción de carácter general*/
        catch (Exception exc) {
            jlblInformacion.setText(GestorIdiomas.getMessage("error.general"));
        }
    }

    /**
     * Método main de la clase
     * {pre: }
     * {post: se instancia la clase}
     * @param args[] es un arreglo de parámetros que recibe la clase para parametrizar sus instanciación
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Servidor().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jbtnDetenerServidor;
    private javax.swing.JButton jbtnIniciarServidor;
    private javax.swing.JLabel jlblInformacion;
    // End of variables declaration//GEN-END:variables

}
